, ,

Créer un nouveau service avec systemd

Ce tutoriel décrit la démarche à suivre pour transformer un programme en un service systemd pouvant être lancé automatiquement au démarrage du système.

Pré-requis

Principes de base

Comme Upstart, systemd utilise des fichiers de configuration correspondant aux différents services à manipuler. Il n'est (en général) plus nécessaire de créer des fichiers bash pour gérer le service, systemd s'occupe de tout (lancement, arrêt, redémarrage, status, gestion des logs, etc)
Ces fichiers de configuration se trouvent dans /etc/systemd/system/ et permettent d'indiquer les conditions d'activation ou désactivation d'un service, leur propriétaire, etc.

Ce dossier étant essentiel au bon fonctionnement de votre système, il est conseillé d'en faire une sauvegarde avant toute modification de fichier.
Dans un terminal saisissez:
sudo cp -r /etc/systemd/system /etc/systemd/system.save$(date +%Y%m%d)

Une fois le fichier de configuration de service crée, il faut l'activer pour qu'il soit pris en compte par le système et lancé à chaque démarrage.

systemctl enable <nom du service>.service

On peut ensuite le lancer pour test et contrôler sa bonne marche avec les commandes suivantes :

systemctl start <nom du service>.service
systemctl status <nom du service>.service

Pour plus d'infos sur les diverses commandes de gestion, voir la page systemd

Type de services systemd

Systemd defini differents types de services :

Exemples de services et leur fichier de configuration

Exemples de service de type "oneshot"

Un exemple est le service iptables. Voici un extrait de son fichier de configuration :

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/libexec/iptables.init start
ExecStop=/usr/libexec/iptables.init stop 


Exemple de service de type "simple"

Un exemple est le service deluged qui permet de lancer le service correspondant à la version deamon du client bit-torrent deluge.

/etc/systemd/system/deluged.service
[Unit]
Description=Deluge Bittorrent Client Daemon
After=network-online.target
 
[Service]
Type=simple
 
User=deluge
Group=deluge
UMask=007
 
ExecStart=/usr/bin/deluged -d
 
Restart=on-failure
 
# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300
 
[Install]
WantedBy=multi-user.target

Exemple de service modèle

Il est possible de créer plusieurs services à partir d'un même modèle. Par exemple, la gestion des consoles est gérée par un seul modèle getty@.service qui est décliné en getty@tty1.service, getty@tty2.service, etc pour chacune des consoles tty de votre machine. On peut aussi imaginer des services où chaque instance correspond à un utilisateur de la machine. Par exemple, on peut lancer le service syncthing@.service pour synchroniser en parallèle avec syncthing les fichiers de Toto, Gerard et Milou :

syncthing@.service
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization for %I
Documentation=man:syncthing(1)
After=network.target
Wants=syncthing-inotify@.service
 
[Service]
User=%i
ExecStart=/usr/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
UMask=0002
 
[Install]
WantedBy=multi-user.target
systemctl list-dependencies [<unit>] 
systemctl enable syncthing@Toto.service
systemctl enable syncthing@Gerard.service
systemctl enable syncthing@Milou.service

Exemple de service cyclique.

Création du fichier de gestion ⇒ /etc/systemd/system/MAJ0.timer

[Unit]
Description=effectue une mise à jour de l'ordinateur quinze minutes après le démarrage de la machine et  itère toutes les trente minutes.
[Timer]
OnBootSec=15minutes   
# le service démarrera 15 minutes après le démarrage de la machine
OnUnitActiveSec=30minutes  
# le service démarrera toutes les trente minutes après la dernière activation du timer
###    voir toutes les possibilités de choix  dans ce  document http://man7.org/linux/man-pages/man7/systemd.time.7.html
[Install]
WantedBy=timers.target
[Service]
User=XXXXXXXXX  # à renseigner ? root par défaut.
Group=users
ExecStart=/etc/init.d/MAJ0

Création du fichier contenant ce qu'il faut faire donc sous /etc/initi.d/MAJ0 dans cet exemple

#! /bin/sh
date >/var/log/MAJ0.log
echo "Faire les mises à jour" >>/var/log/MAJ0.log
sudo apt install tototo  >>/var/log/MAJ0.log
sudo apt autoremove
echo  "Pas encore trouvé pour informer l'utilisateur de la proposition d'épuration. Donc rien n'est épuré" >>/var/log/MAJ0.log
exit 0 

Avec les commande de gestion assiociées

sudo systemctl start  MAJ0.timer
sudo systemctl status MAJ0.time
sudo systemctl stop   MAJ0.timer
sudo systemctl daemon-reload 
sudo systemctl enable MAJ0.timer 

Ressources


Contributeurs: zarmu